package com.shop.cereshop.app.dao.product;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.shop.cereshop.app.page.product.ProductVisitListVO;
import com.shop.cereshop.app.param.product.QueryProductListDTO;
import com.shop.cereshop.app.param.product.QueryProductVisitDTO;
import com.shop.cereshop.commons.domain.product.CereProductVisit;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 商品访问记录表 Mapper 接口
 */
@Mapper
public interface CereProductVisitMapper extends BaseMapper<CereProductVisit> {

    List<ProductVisitListVO> queryUserProductVisitList(QueryProductVisitDTO param);

    void deleteByUserId(@Param("buyerUserId") Long buyerUserId);

    void deleteByUserIdAndVisitId(@Param("buyerUserId") Long buyerUserId, @Param("visitId") Long visitId);

    void deleteBatch(@Param("buyerUserId") Long buyerUserId, @Param("visitIds") List<Long> visitIds);

    /**
     * 根据用户ID查询访问记录
     */
    List<CereProductVisit> selectByUserId(@Param("userId") Long userId);

    /**
     * 根据商品ID查询访问记录
     */
    List<CereProductVisit> selectByProductId(@Param("productId") Long productId);

    /**
     * 查询用户对商品的访问记录
     */
    List<CereProductVisit> selectByUserAndProduct(@Param("userId") Long userId, @Param("productId") Long productId);

    /**
     * 查询用户对商品的最新的访问记录
     */
    CereProductVisit selectLastVisitByUserAndProduct(@Param("userId") Long userId, @Param("productId") Long productId);

    /**
     * 统计商品访问量
     */
    Long countVisitByProductId(@Param("productId") Long productId);

    /**
     * 统计时间段内商品访问量
     */
    Long countVisitByTimeRange(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);

    /**
     * 获取热门商品列表（按访问量排序）
     */
    List<Map<String, Object>> selectHotProducts(@Param("limit") Integer limit);

    /**
     * 获取用户最近访问记录
     */
    List<CereProductVisit> selectRecentVisitsByUser(@Param("userId") Long userId, @Param("limit") Integer limit);

    /**
     * 删除指定时间之前的访问记录（用于数据清理）
     */
    Integer deleteByTimeBefore(@Param("time") LocalDateTime time);

}
